package org.xyl.engine;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.aigc.generation.models.QwenParam;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentParser;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.TextDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.data.embedding.Embedding;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.store.embedding.EmbeddingMatch;
import dev.langchain4j.store.embedding.EmbeddingStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.xyl.dto.RAGResponse;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

/**
 * 企业级RAG服务接口，定义RAG系统的核心功能
 * 支持异步处理、向量存储、文档处理和智能问答
 */
public interface EnterpriseRAGService {

    /**
     * 异步处理文档，包括加载、分割、向量化和存储
     * @param documentPath 文档路径
     * @return 处理结果
     */
    CompletableFuture<String> processDocumentAsync(String documentPath);

    /**
     * 处理文档，包括加载、分割、向量化和存储
     * @param documentPath 文档路径
     */
    void processDocument(String documentPath);

    /**
     * 企业级RAG问答，集成向量检索和LLM生成
     * @param question 用户问题
     * @param vectorLibraryName 向量库名称（可选）
     * @return RAG增强的回答
     */
    RAGResponse ragQuery(String question, String vectorLibraryName);
    
    /**
     * 企业级RAG问答（兼容方法）
     * @param question 用户问题
     * @return RAG增强的回答
     */
    default RAGResponse ragQuery(String question) {
        return ragQuery(question, null);
    }

    /**
     * 批量处理多个文档
     * @param documentPaths 文档路径列表
     */
    void batchProcessDocuments(List<String> documentPaths);

    /**
     * 清空向量存储
     */
    void clearVectorStore();

    /**
     * 获取向量存储状态
     * @return 存储状态信息
     */
    Map<String, Object> getVectorStoreStats();

    /**
     * 构建RAG提示
     * @param context 上下文信息
     * @param question 用户问题
     * @return 完整提示
     */
    String buildPrompt(String context, String question);

    /**
     * 使用DashScope生成回答
     * @param prompt 提示文本
     * @return 生成的回答
     * @throws Exception 异常
     */
    String generateWithDashScope(String prompt) throws Exception;

    /**
     * 生成简单回答（降级策略）
     * @param question 用户问题
     * @param context 上下文
     * @return 简单回答
     */
    String generateSimpleAnswer(String question, String context);
}